package com.example.reactive.controller;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@RestController
@RequestMapping("/reactive")
public class IndexController {

    @GetMapping("/home")
    public Mono<String> hello() {
        return Mono.just("Hello, World!");
    }

    @PreAuthorize("hasRole('USER')")
    @GetMapping("/find")
    public Flux<String> getUser() {
        return Flux.just("find Hello, World!");
    }

    @PostMapping("/insert")
    public Flux<String> createUser() {
        return Flux.just("insert Hello, World!");
    }

    @PutMapping("/update")
    public Flux<String> updateUser() {
        return Flux.just("update Hello, World!");
    }

    @DeleteMapping("/delete")
    public Flux<String> deleteUser() {
        return Flux.just("delete Hello, World!");
    }

}

// 响应式编程是通过建立一个用于数据流通的管道，数据在这个管道中进行各种各样的处理，在管道的每个阶段，是不能知道哪一步操作被哪一个线程执行了的，它们可能在同一个线程也可能不是。

// 接口的放回之必须是 Mono 或 Flux 类型，否则会抛出异常。
// Mono和Flux是Reactor中的两个核心类，两者都是响应式流中Publisher的实现，Flux表示任意个数据项的管道，Mono表示至多一个数据项的管道。

// 在 Reactive Web 应用中也能够像在 Servlet 应用中一样使用 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping 注解来定义 HTTP 请求方法。
// 具体参考 Spring 官方文档： https://docs.springjava.cn/spring-framework/reference/web/webflux/new-framework.html
// https://docs.springjava.cn/spring-framework/reference/web/webflux/controller.html
